﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AlgoHero.Modelo;
using System.Threading;

namespace AlgoHero.Vista
{
    public class ReproductorDeAudio
    {

        private Queue<NotaMidi> cola;
        private bool encendido;
        private Piano piano;
        private double tiempoFisicoCompas;

        public double TiempoFisicoCompas
        {
            get { return tiempoFisicoCompas; }
            set { tiempoFisicoCompas = value; }
        }

        private int tiempoMusicalCompas;

        public int TiempoMusicalCompas
        {
            get { return tiempoMusicalCompas; }
            set { tiempoMusicalCompas = value; }
        }


        public ReproductorDeAudio()
        {
            this.cola = new Queue<NotaMidi>(30);
            this.encendido = false;
            this.piano = new Piano();
            this.tiempoFisicoCompas = 1;
            this.tiempoMusicalCompas = 1;
        }

        public void run()
        {
            while (encendido)
            {
                NotaMidi notaMidi;
                System.Console.WriteLine(this.cola.Count);
                try
                {
                    notaMidi = this.cola.Dequeue();
                }
                catch (System.InvalidOperationException e)
                {
                    notaMidi = null;
                }
                if (notaMidi != null)
                {
                    System.Console.WriteLine("ping");
                    piano.reproducir(notaMidi.NumeroMidi, notaMidi.Duracion);
                }
                else
                {
                    try
                    {
                        System.Console.WriteLine("silencio");
                        Thread.Sleep(500);
                    }
                    catch (Exception e)
                    {
                        System.Console.WriteLine(e.StackTrace);
                    }
                }
            }
        }

        public void Encender()
        {
            this.encendido = true;
        }

        public void Reproducir(NotaMidi notaMidi)
        {
            System.Console.WriteLine(this.cola.Count);
            try
            {
                this.cola.Enqueue(notaMidi);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.StackTrace);
            }
        }

        public void Apagar()
        {
            this.encendido = false;
        }

        public void reproducirAcorde(Acorde acorde)
        {
            double tiempoFisicoAcorde = acorde.CalcularDuracionFisica(this.tiempoFisicoCompas, this.tiempoMusicalCompas);
            NotaMidi notaMidi;
            foreach (Nota nota in acorde)
            {
                notaMidi = new NotaMidi((int)nota.Frecuencia, (int)tiempoFisicoAcorde);
                this.Reproducir(notaMidi);
            }
        }
    }
}
